struct domain *d = current->domain;
struct grant_table *gt = d->grant_table;
struct active_grant_entry *act;
- long res = 0;
+ long res;
int i;
if (copy_from_guest(&op, uop, 1))
return -EFAULT;
+ res = -EINVAL;
if (op.version != 1 && op.version != 2)
- return -EINVAL;
+ goto out;
+
+ res = 0;
+ if ( gt->gt_version == op.version )
+ goto out;
spin_lock(>->lock);
/* Make sure that the grant table isn't currently in use when we
gt->gt_version,
op.version);
res = -EBUSY;
- goto out;
+ goto out_unlock;
}
}
}
{
res = gnttab_populate_status_frames(d, gt);
if ( res < 0)
- goto out;
+ goto out_unlock;
}
if ( op.version < 2 && gt->gt_version == 2 )
gt->gt_version = op.version;
-out:
+out_unlock:
spin_unlock(>->lock);
+out:
+ op.version = gt->gt_version;
+
+ if (copy_to_guest(uop, &op, 1))
+ res = -EFAULT;
+
return res;
}
*/
#define GNTTABOP_set_version 8
struct gnttab_set_version {
- /* IN parameters */
+ /* IN/OUT parameters */
uint32_t version;
};
typedef struct gnttab_set_version gnttab_set_version_t;